<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        function Person(name,age){
            this.name = name 
            this.age = age 
            // 1. 如果new的构造函数里面有return， 并且return的是一个对象，直接返回它
            // return {msg:'hello'}
            // 2. 如果构造函数里面return的是function，直接return这个fn
            return function(){
                console.log(123)
            }
        }
        const obj = new Person('贵贵', 8)
        console.log(obj)
        console.log(obj.__proto__ === Person.prototype)


       function Fn(name, age){
           // const obj = {}
           this.name = name 
           this.age = age 

           // 看它内部有没有return对象或者函数，
       }

       // fn 就相当于是我们要new 的构造函数
       function myNew(fn, ...args){
        // 1. 创建一个空对象
        // const obj = {} // new Object()
        // obj.__proto__ = Fn.prototype
        // 基于fn构造函数原型创建一个新对象  ==> 让 fn.prototype作为 obj的原型
        let obj = Object.create(fn.prototype)

        // 2. 执行构造函数，并且让它内部的this指向我们的obj
        let res = fn.call(obj, ...args)

        // 3. 看Fn调用后有没有返回结果，有，说明fn构造函数内部有return
        if (res && (typeof res === 'object' || typeof res === 'function')) return res
        return obj // ==》obj就是我们最后要的实例
       }
    //    const res = myNew()
    //    res.__proto__ === Fn.prototype
    const res = myNew(Fn, '淞', '3')
    console.log(res.__proto__ === Fn.prototype)
    console.log(res)
    </script>
</body>
</html>